#ifndef _Espace
#define _Espace

#include"Vecteur.h"

/**
*\file Espace.h
*\brief Fichier d'en-tête Espace.h. 
*
*Ce fichier d'en-tête gère tous ce qui concernent l'espace dans lequel évoluera le personnage
*
*\author Moctar NDIAYE
*\version version finale
*/

/**
* \struct espace
* \brief Cette structure est l'espace
* L'espace est un cube divisé en petits cubes de même taille qui soit plein, soit vide. Le personnage se déplacera sur les cubes pleins mais il ne pourra être que dans un cube vide.
*/
typedef struct
{
  int *terrain; /**< tableau de 0 ou de 1 : 0 pour un cube vide, 1 pour un cube plein*/
  int taille; /**< taille du tableau*/
}espace;


/** 
*\fn void InitEspace(espace * esp,int n);
*\brief initialise l'espace 
*\param [out] *esp : pointeur l'espace à créer dans le tas
*\param [in] n : la taille de l'espace
* \pre l'espace n'est pas encore initialisé
* \post l'espace est initialisé dans le tas
* \warning Cette fonction implique OBLIGATOIREMENT l'utilisation de freeEspace sur le même espace à la fin du programme
*/
void InitEspace(espace * esp,int n);


/**
* \fn void initEspaceAlea(espace *esp,vecteur * position,vecteur *arrivee, int n);
* \brief Initialise l'espace en créant un labyrinthe aléatoire mais ayant une solution. On a la case de départ
* \param [out] *esp : pointeur sur l'espace à initialisé
*\param [out] *position : pointeur sur la case de départ du labyrinthe
*\param [out] *arrivee : pointeur sur la case d'arrivée du labyrinthe
* \param [in] n : taille du nouvel espace
* \pre L'espace ne doit pas être initialisé
* \post L'espace doit être initialisé doit être un labyrinthe ayant une solution
* \warning Cette fonction implique OBLIGATOIREMENT l'utilisation de freeEspace sur le même espace à la fin du programme 
*/
void initEspaceAlea(espace *esp,vecteur * position,vecteur *arrivee, int n);

/**
*\fn void initEspaceFichier(espace * esp, vecteur * v, char *pied, char *regard, char fichier[]);
*\brief Initialise un espace à partir d'un fichier texte.
*\param [in,out] *esp : pointeur sur l'espace à initialiser
*\param [out] *v : pointeur sur le vecteur donnat la case de départ du labyrinthe
*\param [out] *pied : pointeur sur la direction des pieds
*\param [out] *regard : pointeur sur la direction du regard
*\param [in] fichier[] : chaîne de caractère donnant le nom du fichier texte
*\pre L'espace ne doit pas être déjà initialisé et le fichier doit être un fichier texte.
*\post L'espace doit être initialisé à partir du fichier
* \warning Cette fonction implique OBLIGATOIREMENT l'utilisation de freeEspace sur le même espace à la fin du programme 
*/
void initEspaceFichier(espace * esp, vecteur * v, char *pied, char *regard, char fichier[]);



/**
* \fn int getCube(espace *esp,vecteur *vect);
* \brief récupè la valeur d'un cube de coordonnées vect
* \param [in] *esp : pointeur sur l'espace sur lequel on travaille
* \param [in] *vect : pointeur sur le vecteur nous donnant les coordonnées de la case souhaitée
* \return un entier
* \pre l'espace est initialisé et le vecteur à des coordonnées positives strictement inférieures à la taille de l'espace
*/
int getCube(espace *esp,vecteur *vect);

/**
*\fn void setCube(espace *esp,vecteur *vect,int valeur);
* \brief cette procédure modifie la valuer de la case de coodrdonnées vect.
* \param [in,out] *esp : pointeur sur l'espace sur lequel on travaille
* \param [in] *vect : pointeur sur le vecteur nous donnant les coordonnées de la case à modifiée
* \param [in] valeur : la nouvelle valeur que la case prendra
* \pre l'espace doit être initialisé, les coordonnées du vecteur doivent être positives et strictement inférieures à la taille du tableau et la valuer doit être 0 ou 1
* \post la case de coordonées vect doit avoir la nouvelle valeur
*/
void setCube(espace *esp,vecteur *vect,int valeur);


/**
* \fn void freeEspace(espace *esp);
* \brief Libère l'espace du tas à l'emplacement où il à été alloué
* \param [in,out] *esp : l'espace qui doit être libéré
* \pre L'espace doit être initialisé
* \post L'espace n'existe plus dans le tas
* \warning Cette fonction est à utilisé en parallèle avec les fonctions initialisant les espaces.
* \warning N'utilisez cette fonction que lorsque vous n'aurez plus besoin de votre espace. Elle le détruit
*/
void freeEspace(espace *esp);
#endif
